#include "head.h"
typedef struct msg
{
     uint32_t ip;
     uint16_t port;
     char buf[1000];//消息的内容
}MSG;

//把字符串IP转为数字IP
uint32_t stringIPtoNum(char * pIP)
{
     uint32_t nIP = 0;
     // AF_INET是代表IPV4地址的意思，AF_INET6代表IPV6
     inet_pton(AF_INET,pIP,&nIP);
     return nIP;
}

//把数字IP转为字符串IP
void numIPtoString(uint32_t ip, char * psIP, int size)
{
     inet_ntop(AF_INET,&ip,psIP,size);
}

//接受服务器发来的消息
void * work(void * pData)
{
     int fd = *(int *)pData;
     //循环的读取消息
     while (1)
     {
          MSG m1;
          //read是一个阻塞函数
          if(0>=read(fd,&m1,sizeof(m1)))
          {
               perror("服务器完了，我也不想活了");
               exit(0);
               break;
          }
          //说明收到了一个退出消息，直接跳出循环
          if(strcmp(m1.buf,"quit")==0)
          {
               exit(0);
               break;
          }
          printf("收到服务器消息：%s\n",m1.buf);
     }
     
}

int main()
{
     //创建一个SOCKET，并且返回一个套接字的文件描述符
     int fd = socket(AF_INET,SOCK_STREAM,0);
     if(fd == -1)
     {
          perror("");
     }

     //地址结构体，需要填写IP，端口，地址族（IPV4/IPV6）
     // typedef struct sockaddr_in MYADDR;
     struct sockaddr_in addr;
     addr.sin_addr.s_addr = stringIPtoNum("192.168.70.37");//指定IP
     addr.sin_port = htons(9001);//指定端口
     addr.sin_family = AF_INET;//指定地址协议族

     //在服务器上与connect对接函数是accept
     while(-1 == connect(fd,(struct sockaddr*)&addr,sizeof(addr)))
     {
          perror("重连中...");
          sleep(1);
     }

     pthread_t pt;
     pthread_create(&pt,NULL,work,&fd);

     //循环的从键盘输入并发送消息
     while (1)
     {
          MSG m1;//消息结构体，里面有地址结构体和消息内容
          printf("请输入消息内容\n");
          scanf("%s",m1.buf);

          write(fd,&m1,sizeof(m1));
     }

     close(fd);
     return 0;
}